<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 函数的扩展
    // 1. 函数参数的默认值
    // 在参数的地方用等号
    // const fn = (a, b = 10) => {
    //   return a + b;
    // };
    // fn(3, 4);
    // fn(10);

    

    // 2.rest参数
    // 用扩展运算符的方式可以接受诺干个参数
    // function add(...values) {
    //   let sum = 0;
    //   for (var val of values) {
    //     sum += val;
    //   }
    //   return sum;
    // }
    // add(2, 5, 3) // 10



    // 3.函数有一个name属性
    // function foo() {}
    // foo.name // "foo"
    // var f = function () {};
    // f.name // "f"



    // 4. try...catch
    // 正常是要写在try里面的
    // try的代码如果出现了红色的报错，就会走catch
    // 可以自定义红色的报错，不会中断下面的代码继续执行
    // try {
    //   console.log(a);
    //   console.log(1);
    //   console.log(2);
    //   console.log(3);
    // } catch (err) {
    //   // throw err;
    //   if (err.message.includes("defined")) {
    //     alert("这里有变量没有定义")
    //   }
    // }
    // console.log(123123123);





    // 5. 运算符扩展
    // ** 表示的就是幂运算
    // console.log(2 ** 3) // 2的3次方
    // a **= 2;
    // 等同于 a = a * a;
    // b **= 3;
    // 等同于 b = b * b * b;




    // 6. 链判断运算符 ?.
    // 避免报错，优化代码(不用写if)
    // 当不确定是否定义过某个变量或者或者函数的时候用
    // const obj = {
    //   a: 1,
    //   b: 2,
    //   c: {
    //     x: 10,
    //     y: 20
    //   }
    // }
    // console.log(obj.c.z); // undefined
    // console.log(obj.c.z.abc); // 报错
    // console.log(obj.c.z?.abc); // undefined

    // let movieList;
    // // 模拟一个请求
    // fetch("xxx").then(res => {
    //   movieList = res.data;
    // })
    // movieList?.forEach()

    // obj.fn3?.(); // 函数也能用，表示定义过就执行



  </script>
</body>
</html>